<?php
/**
 * Created by PhpStorm.
 * User: qiaoli
 * Date: 15/11/23
 * Time: 上午12:01
 */
define('IMAGE_RATIO_KEY', 'image_get_image_ratio');

class Imagem extends CI_Model
{
    const MC_KEY_IMG_INFO = 'mc_key_img_info_';

    public function __construct()
    {
        parent::__construct();
    }

    private function is_ali_img($img_url)
    {
        if (substr($img_url, 0, 34) == 'http://proimg.medical-lighter.com/') {
            return true;
        }
        return false;
    }

    public function get_ali_img_info($img_url)
    {
        if (!$this->is_ali_img($img_url)) {
            return null;
        }

        $url_info = $img_url;
        if (strpos($img_url, "@!") !== false) {
            $url_info = explode("@!", $img_url)[0];
        }
        $url_info .= "@info";

        $info = json_decode(file_get_contents($url_info), true);
        return $info;
    }


    public function getimagesize($img_url)
    {
        $key = self::MC_KEY_IMG_INFO . "{$img_url}";
        $old_data = $this->mc->get($key);
        if (!empty($old_data)) {
            return $old_data;
        }

        $new_data = [];

        if ($this->is_ali_img($img_url)) {
            // 调用 aliyun 图片信息接口
            $img_info = $this->get_ali_img_info($img_url);
            if ($img_info) {
                $new_data = array($img_info["width"], $img_info["height"]);
            }
        }

        if (!$new_data) {
            // 利用图片前几百个字节, 获得图片大小
            $img_info = $this->myGetImageSize($img_url);
            if ($img_info) {
                $new_data = array($img_info["width"], $img_info["height"]);
            }
        }

        if (!$new_data) {
            // 图片全部下载下来, 获取图片大小
            if($img_url)
            {
                $img_info = getimagesize($img_url);
                $new_data = $img_info;
            }
        }

        if ($new_data) {
            $this->mc->save($key, $new_data, 60*60*24*10);
        }
        else {
            $new_data = [600, 800];
        }
        return $new_data;
    }



    /**
     * 获取远程图片的宽高和体积大小
     *
     * @param string $url 远程图片的链接
     * @param string $type 获取远程图片资源的方式, 默认为 curl 可选 fread
     * @param boolean $isGetFilesize 是否获取远程图片的体积大小, 默认false不获取, 设置为 true 时 $type 将强制为 fread
     * @return false|array
     */
    public function myGetImageSize($url, $type = 'curl', $isGetFilesize = false)
    {
        // 若需要获取图片体积大小则默认使用 fread 方式
        $type = $isGetFilesize ? 'fread' : $type;

        $handle = null;

        if ($type == 'fread') {
            // 或者使用 socket 二进制方式读取, 需要获取图片体积大小最好使用此方法
            $handle = fopen($url, 'rb');

            if (! $handle) return false;

            // 只取头部固定长度168字节数据
            $dataBlock = fread($handle, 168);
        }
        else {
            // 据说 CURL 能缓存DNS 效率比 socket 高
            $ch = curl_init($url);
            // 超时设置
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            // 取前面 168 个字符 通过四张测试图读取宽高结果都没有问题,若获取不到数据可适当加大数值
            curl_setopt($ch, CURLOPT_RANGE, '0-240');
            // 跟踪301跳转
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            // 返回结果
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $dataBlock = curl_exec($ch);

            curl_close($ch);

            if (! $dataBlock) return false;
        }

        // 将读取的图片信息转化为图片路径并获取图片信息,经测试,这里的转化设置 jpeg 对获取png,gif的信息没有影响,无须分别设置
        // 有些图片虽然可以在浏览器查看但实际已被损坏可能无法解析信息
        $size = getimagesize('data://image/jpeg;base64,'. base64_encode($dataBlock));
        if (empty($size)) {
            return false;
        }

        $result['width'] = $size[0];
        $result['height'] = $size[1];

        // 是否获取图片体积大小
        if ($isGetFilesize && $handle) {
            // 获取文件数据流信息
            $meta = stream_get_meta_data($handle);
            // nginx 的信息保存在 headers 里，apache 则直接在 wrapper_data
            $dataInfo = isset($meta['wrapper_data']['headers']) ? $meta['wrapper_data']['headers'] : $meta['wrapper_data'];

            foreach ($dataInfo as $va) {
                if ( preg_match('/length/iU', $va)) {
                    $ts = explode(':', $va);
                    $result['size'] = trim(array_pop($ts));
                    break;
                }
            }
        }

        if ($type == 'fread' && $handle) fclose($handle);

        return $result;
    }


    public function get_image_ratio($img_path)
    {
        $mc = $this->cache->memcached;
        $key = IMAGE_RATIO_KEY . $img_path;
        $this->cache->memcached->is_supported();
        $first_ratio = $mc->get($key);
        if(!$first_ratio) {
            $img_info = $this->getimagesize($img_path);
            $first_ratio = $img_info[1] / $img_info[0]; // 高/宽
            if($img_info[1] == 0 || $img_info[0] == 0)
            {
                $first_ratio = 1;
            }
            $mc->save($key,$first_ratio,60*60*24*10);
        }
        return $first_ratio;
    }

    /* 获取启动页数据 */
    public function get_open_leaflets()
    {
        $res = $this->db
            ->select('id,sort,img_url,begin,end,stay_time,author_id')
            ->from('ml_leaflets_page')
            ->where('show',1)
            ->order_by('addtime')
            ->limit(1,0)
            ->get()
            ->result_array();
        if($res[0]['begin']>time())
        {
            return false;
        }
        if(!$res)
        {
            return false;
        }
        return $res;
    }
}